#pragma once
#include "PointLabCore/Prerequisites.h"
#include "PointLabCore/Entity.h"
#include "PointLabCore/Vector3.h"
#include "PointLabCore/Color.h"

namespace PointLabCore
{
	class POINTLABCORE_EXPORT IPointCloud :public PointLabCore::Entity
	{
	public:
		IPointCloud();
		virtual ~IPointCloud();

		virtual Entity* createInstance()override = 0;

		virtual CLASS_TYPE classID()const override;

		virtual bool hasPoint()const = 0;
		virtual PointLabCore::Uint getPointNum() const = 0;
		virtual void resizePointNum(PointLabCore::Uint num) = 0;
		virtual void setPointCoord(PointLabCore::Uint pid, const PointLabCore::Vector3& coord) = 0;
		virtual PointLabCore::Vector3 getPointCoord(PointLabCore::Uint pid)const = 0;
		virtual void appendPointCoord(const PointLabCore::Vector3& coord) = 0;

		virtual bool hasNormal()const = 0;
		virtual PointLabCore::Uint getNormalNum()const = 0;
		virtual void resizeNormalNum(PointLabCore::Uint num) = 0;
		virtual void setPointNormal(PointLabCore::Uint pid, const PointLabCore::Vector3& normal) = 0;
		virtual PointLabCore::Vector3 getPointNormal(PointLabCore::Uint pid)const = 0;
		virtual void appendPointNormal(const PointLabCore::Vector3& normal) = 0;

		virtual bool hasColor()const = 0;
		virtual PointLabCore::Uint getColorNum()const = 0;
		virtual void resizeColorNum(PointLabCore::Uint num) = 0;
		virtual void setPointColor(PointLabCore::Uint pid, const PointLabCore::Color4& color) = 0;
		virtual PointLabCore::Color4 getPointColor(PointLabCore::Uint pid) = 0;
		virtual void appendPointColor(const PointLabCore::Color4& color) = 0;

		virtual void clearAll() = 0;
	};
}
